//定义store
import { defineStore } from "pinia";
import { ref } from "vue";
import { getUserInfoService } from "@/api/user";

/*
    defineStore参数描述：
        第一个参数：给状态起名，具有唯一性
        第二个参数：函数，可以把定义该状态中拥有的内容

    defineStore返回值描述：
        返回的是一个函数，将来可以调用该函数，得到第二个参数中返回的内容
*/

export const useTokenStore = defineStore(
  "token",
  () => {
    //定义响应式token变量
    const token = ref(localStorage.getItem("token") || "");

    //定义一个函数修改token的值
    const setToken = (newToken) => {
      console.log("设置新token:", newToken);
      token.value = newToken;
      localStorage.setItem("token", newToken);
    };

    //定义一个函数移除token的值
    const removeToken = () => {
      console.log("移除token");
      token.value = "";
      localStorage.removeItem("token");
    };

    // 清除token（别名方法，保持与之前代码兼容）
    const clearToken = () => {
      removeToken();
    };

    // 验证token是否有效
    const validateToken = async () => {
      console.log("开始验证token, 当前token:", token.value);
      if (!token.value) {
        console.log("No token found");
        return false;
      }

      try {
        console.log("正在验证token:", token.value);
        const res = await getUserInfoService();
        console.log("验证token响应:", res);
        if (res.code === 0) {
          console.log("token验证成功");
          return true;
        } else {
          console.log("token验证失败，响应码不是0");
          removeToken();
          return false;
        }
      } catch (error) {
        console.error("Token验证失败:", error);
        removeToken();
        return false;
      }
    };

    // 检查token是否存在
    const hasToken = () => {
      const hasToken = !!token.value;
      console.log("检查token是否存在:", hasToken, "当前token:", token.value);
      return hasToken;
    };

    /**
     * 返回一个对象，用于管理token相关的操作
     *
     * @return {Object} 包含token属性和相关方法的对象
     *         - token: 当前的token值
     *         - setToken: 设置token值的方法
     *         - removeToken: 移除token的方法
     *         - clearToken: 清除token的方法
     *         - validateToken: 验证token是否有效的方法
     *         - hasToken: 检查token是否存在的方法
     */
    return {
      token,
      setToken,
      removeToken,
      clearToken,
      validateToken,
      hasToken,
    };
  },
  {
    //开启持久🌹存储
    persist: {
      key: "token",
      storage: localStorage,
      paths: ["token"],
    },
  }
);
